בפרק זה נלמד איך לכתוב את התוכנית הכי נפוצה בעולם (Hello world) וכן איך לנתב את הCI כך שיפעיל את הבקשות שלנו.
Hello World
בשני הפרקים הקודמים למדנו איך אנחנו מתקינים את הCI ומה זה MVC.
בשלב הזה אנחנו מוכנים לכתוב את התוכנים הראשונה שלנו.
hello.php - הקונטרולר שלנו
הקונטרולר הוא החלק הראשון שהמערכת שלנו תפעיל והוא זה שמנהל את התוכנית שלנו ומעביר את המידע בין החלקים שלה.
כדי לייצר Controller כנסו לתיקיית application/controllers ותחתיה צרו את הקובץ hello.php (אותיות קטנות בלבד!)
הקובץ צריך להראות כך:
class Hello extends CI_Controller{
function index(){
echo "hello world";
}
}
function index(){
echo "hello world";
}
}
ראשית: הקונטרולרים כולם הם קלאסים שהCI מפעיל עבורנו, ולכן יצרנו קלאס.
שם הקונטרולר - צריך להיות כמו השם של הקובץ בCamel Letters ובמילים אחרות, אם לקובץ קוראים hello אז לקלאס נקרא Hello, חשוב מאוד שתקפידו על זה אחרת הCI לא יעבוד כמו שצריך, ולכל החכמולוגים שמנסים את זה על windows ושם הכל עובד, חכו חכו שתעלו גירסא לפרודקשן בארבע לפנות בוקר, ואז תגלו שחצי מהמערכת לא עובדת כי יש לכם בעיה עם שמות קבצים.
extend CI_Controller - כאשר אנחנו יורשים את הCI_Controller אנחנו נותנים לקונטרולר שלנו את כל האפשרויות והיכולות של הCI.
פונקציית הindex - בדיוק כמו שאם שמים קובץ index בתוך תיקייה אז הapache מפעיל אותו אוטומטית, כך גם לגבי מתודת index, הCI יפעיל אותה אוטומטית אם לא נגדיר מתודה אחרת.
שימו לב שעשיתי מעשה אסור והוצאתי Output מהקונטרולר ישירות למשתמש, אסור לעשות זאת בMVC, וכל הפלט של המערכת צריך לשבת בview. אבל את זה נלמד בהמשך.
ועכשיו להרצה של התוכנית הראשונה שלנו!
כדי להריץ את התוכנית עליכם לרשום בשורת הכתובת של הדפדפן את הכתובת הבאה:
http://localhost/CI/index.php/hello
ואם הכל עבר כמו שצריך אתם אמורים לקבל את הפלט hello world
מזל טוב! כתבנו את התוכנית הראשונה שלנו!
routing
לאחר שאנחנו כותבים קונטרולר, אנחנו רוצים להפעיל אותו, למי שמעולם לא התשמש בפריימוורקים, מצפה הפתעה, עד היום התרגלנו להפעיל כל קובץ בנפרד. לדוגמא אם הייתה לנו חנות אז היו לנו הקבצי הרצה:
index.php
products.php
categories.php
cart.php
order.php
וכו'...
כאשר אנחנו עוברים לפריימוורק, יש לנו קובץ אחד שאליו בלבד קוראים, וזהו הdispatcher שלנו, הוא זה שמעלה את כל הפריימוורק, ומתחיל את הפעולה של המערכת, אצלנו זהו הindex,php
ולרוב כל קובץ מוחלף בקונטרולר.
כך שיהיו לנו את הקונטרולרים home,products,cart וכו'...
הפעלת קונטרולר
כיוון שאנחנו רוצים להפעיל קונטרולר מסויים אנחנו קוראים לindex.php ומצמידים לו את שם הקונטרולר שאותו אנחנו רוצים להריץ, ולכן בדוגמא לפנינו זה יהיה:
http://localhost/CI/index.php/hello
בהמשך אנחנו נלמד איך "להעלים" את הindex.php כך שתהיה לנו כתובת יפה ונקייה שתראה כך:
http://localhost/CI/hello
בעצם אמרנו לCI להפעיל את הקונטרולר שנקרא hello ובתוכו הCI הפעיל אוטומטית את המתודה שנקראת Index.
שימו לב - אם לא תהיה מתודת index יתקבל דף 404
הפעלת מתודה ספציפית
בתוכנית נורמאלית יהיו לנו הרבה מתודות תחת אותו קונטרולר, לדוגמא הקונטרולר product יכיל בתוכו את המתודות, add,delete,show_all וכו'..
כדי לקרוא למתודה ספציפית תחת קונטרולר אנחנו פשוט כותבים את השם שלה אחרי שם הקונטרולר לדוג':
http://localhost/CI/index.php/hello/byname
class Hello extends CI_Controller{
function index(){
echo "Hello world";
}
function byname(){
echo "Hello Alon";
}
}
function index(){
echo "Hello world";
}
function byname(){
echo "Hello Alon";
}
}
שליחת פרמטרים
הCI מאפשר לנו לשלוח פרמטרים אל המתודות דרך הURL, באמצעות שירשור שלהם אחרי המתודה.
לדוגמא:
http://localhost/CI/index.php/hello/byname/alon
class Hello extends CI_Controller{
function index(){
echo "Hello world";
}
function byname($userName=''){
echo "Hello $userName";
}
}
function index(){
echo "Hello world";
}
function byname($userName=''){
echo "Hello $userName";
}
}
שימו לב שאנחנו נותנים ערך ברירת מחדל למשתנה של המתודה, אחרת אנחנו נקבל ERROR אם לא נשלח ערך בURL.
עם הנסיון והזמן אני אישית מצאתי שליחת ערכים ישירות למתודה כלא נוחה ולא גמישה מספיק ואני מעדיף להעביר פרמטרים דרך הGET.
לדוגמא:
http://localhost/CI/index.php/hello/byname/?name=Alon
ולמשוך את המידע ממערך ה$_GET...
סיכום
מבנה הURL כאשר משתמשים בCI נראה כדלקמן:
http://example.com/[contoroller]/[method]/[param1]/[param2]/...
הסתרת הindex.php
כדי להסתיר את הindex.php בURL אנחנו צריכים להשתמש בתוספת של הapache שנקראת mod_rewrite בשילוב עם .htaccess, התוספת הזאת היא סטנדרטית בכל איחסון שטיפה מכבד את עצמו וניתן להפעיל אותה בקלות בwamp על ידי סימון התפריט:
apache->apache modules->rewrite_module
אני לא הולך להיכנס כאן לעובי הקורה של הmod_rewrite והhtaccess גם כי זה נושא גדול בפני עצמו, גם כי זה יכריח אותי ללמד regular expressions וגם כי אני כבר עייף ויש לי מחר עבודה..
אבל על רגל אחת: בתיקייה של הCI ליד הindex.php צרו קובץ בשם .htaccess
(תחת windows תפתחו ++Notepad ובעת שמירת הקובץ תשמרו אותו כ.htaccess, נסיון ליצור את הקובץ בצורה אחרת יביא להודעת שגיאה של הווינדווס)
והכניסו לתוכו את התוכן הבא:
RewriteEngine On
RewriteCond $1 !^(index\.php|robots\.txt|favicon\.ico|uploads|media)
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond $1 !^(index\.php|robots\.txt|favicon\.ico|uploads|media)
RewriteRule ^(.*)$ index.php?/$1 [L]
הקובץ הזה נותן הוראה לapache שכל קריאה לתוכן כלשהו מתוך התיקייה בה אנחנו יושבים תנותב אל index.php למעט אם מבקשים את הindex.php עצמו או את robots.txt,favicon.ico או תוכן מתוך התיקיות uploads או media.
כיוון שההוראה הזאת היא ברמת הapache אם תשימו תוכן סטטי כלשהו מחוץ לuploads או media הבקשה תנותב אל הindex.php
לדוגמא אם אני אבקש את http://localhost/CI/logo.gif האפאצ'י יפרש את זה כhttp://localhost/CI/index.php/logo.gif
ולכן אנחנו מייצרים תיקיית media שכל התוכן הסטטי יושב בתוכה.
תגובות לכתבה:
אחלה מאמר כמו קודמיו :)
יפה מאוד
רק לא ברור כל כך הסוף..
תודה רבה סוף סוף משהו מסודר בMVC
חבל שאין קישור לפוסטים הקודמים.